// 导入axios中封装的类型
import { AxiosRequestConfig, AxiosResponse } from 'axios'
import { ResponseConfig } from './type'
// 导入我们自己封装的类
import { Request } from './request'
import axiosErrorHandler from './axiosErrorHandler'
import { reLoading, ajaxError } from '@/commponents/common/GlobalModal'
import storage from '@/utils/storageManage'

/**
 * 实例化时传入拦截器的一些简单配置
 * 注意：未来我们的项目可能需要请求多种类型的接口
 * 比如：同一个项目下，我们可能需要请求数据服务器接口，也可能请求应用(app)服务器接口，还有可能需要获取定义的其它服务器
 * 每个服务器的响应类型都是不一样的，所以我们需要对每一个服务器进行不同的实例化操作
 */
export default new Request({
  // 针对http://47.93.101.203/配置的前缀, 暂时称之为sapi
  baseURL: '/sapi',
  // 超时时间
  timeout: 3000,
  // 是否显示loading 配置统一显示loading
  showLoading: true,
  // 是否对一些接口状态做统一处理，因为我们不同接口返回的错误代码不一致，所以，这里不使用统一的错误处理而是由当前实例配置进行错误处理
  handlerStatus: false,
  interceptors: {
    /**
     * 针对http://47.93.101.203/配置的请求拦截器
     * @param config
     * @returns
     */
    requestInterceptor: (config: AxiosRequestConfig) => {
      console.log(
        '实例的请求拦截, 它应该可以接收到统一拦截配置返回的config',
        config
      )
      // 当前实例特有的修改，增加一个header属性
      config.headers = {
        ...config.headers,
        // sapi的token配置
        'Authori-zation': `Bearer ${storage.get('token')}`,
      }
      // 无论是否修改，这里必须有一个AxiosRequestConfig类型的返回值
      // 因为我们在定义接口的时候定义了返回值类型为RequestInterceptors而非undefined或者void
      return config
    },
    requestCatch: (err: any) => {
      console.log('实例的请求错误', err)
      return Promise.reject(err)
    },
    /**
     * 针对http://47.93.101.203/配置的响应拦截器
     * @param res
     * @returns
     */
    responseInterceptor: (res: AxiosResponse) => {
      console.log('实例的响应拦截', res)
      if (res.status === 200) {
        return res
      }
      // 没有返回状态，表示后台返回了一个Html文件或txt文件
      if (!res.status) {
        ajaxError<string>(['服务异常, 请联系管理员或稍后重试'])
      }
      // 当前实例特有的状态，接口返回未登陆
      if (res.status === 410000) {
        reLoading()
      }
      // 直接将错误返回到组件中或调用api的地方
      throw res
    },
    responseCatch: (err: any) => {
      console.log('实例的响应错误', err)
      return Promise.reject(err)
    },
  },
})
